//********************************************************************
//	created:	16:10:2011   19:11
//	filename: 	lockqueue.h
//	author:		tiamo
//	purpose:	locked queue
//********************************************************************

#pragma once

namespace utils
{
	//
	// locked queue
	//
	template<typename ItemType>
	class LockedQueue
	{
	public:
		//
		// constructor
		//
		LockedQueue()														{}

		//
		// destructor
		//
		~LockedQueue()														{}

		//
		// insert
		//
		void push(ItemType const& item)										{utils::Locker locker(mLock); mQueue.push(item);}

		//
		// push
		//
		void push(ItemType&& item)											{utils::Locker locker(mLock); mQueue.push(std::move(item));}

		//
		// pop
		//
		ItemType pop()														{utils::Locker locker(mLock); if(mQueue.empty()) return ItemType(); ItemType item = std::move(mQueue.front()); mQueue.pop(); return item;}

		//
		// pop
		//
		bool pop(ItemType& item)											{utils::Locker locker(mLock); if(mQueue.empty()) return false; item = std::move(mQueue.front()); mQueue.pop(); return true;}

		//
		// pop
		//
		ItemType popThrow()													{utils::Locker locker(mLock); ItemType item = std::move(mQueue.front()); mQueue.pop(); return item;}

		//
		// clear
		//
		void clear()														{utils::Locker locker(mLock); while(!mQueue.empty()) mQueue.pop();}

	private:
		//
		// queue
		//
		std::queue<ItemType>												mQueue;

		//
		// lock
		//
		utils::Mutex														mLock;
	};
}
